package com.dragon.modules.yuegou.model.coupon;

import com.dragon.modules.yuegou.entity.coupon.CouponTemplateEntity;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateCheckedStatus;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateFormat;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateOwnerType;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateScope;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateShelfStatus;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateTimeLimitType;
import com.dragon.modules.yuegou.enums.coupon.CouponTemplateType;
import com.dragon.modules.yuegou.model.product.Sku;
import com.dragon.modules.yuegou.model.product.Spu;
import io.swagger.annotations.ApiModelProperty;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 优惠券模板模型类
 * 
 * @author pbuilder generated
 * @date 2019-05-15 20:07:23
 * @company sgy
 * @version 2.0
 * @see Length 长度限制
 * @see NotNull 对象非空
 * @see NotEmpty 字符串、集合、表、数组非空
 */
public class CouponTemplate extends CouponTemplateEntity {

	@ApiModelProperty("是否小票兑换")
	private Boolean isTickets;

	@ApiModelProperty("库存状态：0-存在、1-不存在")
	private Integer status;

	@ApiModelProperty("Spu使用范围")
	private List<Spu> scopeSpuList;
	
	@ApiModelProperty("Sku使用范围")
	private List<Sku> allowSkuList;
	
	@ApiModelProperty("Sku列表总计金额")
	private BigDecimal allowSkuFee;
	
	@ApiModelProperty(value = "使用范围商品列表", required = true)
	private List<String> scopeSpuIdList;

	@ApiModelProperty("可以使用的停车场列表")
	private List<CouponScopePark> couponScopeParkList;

	@NotNull
	@ApiModelProperty(value = "[随机券]分布段列表")
	private List<CouponTemplateRandom> randomList;
	
	@ApiModelProperty("可以使用的SPU列表")
	private List<CouponScopeSpu> couponScopeSpuList;

	@ApiModelProperty("可以使用的商户列表")
	private List<CouponScopeMerchant> couponScopeMerchantList;

	@ApiModelProperty("可以使用的商品分类列表")
	private List<CouponScopeProductCategory> couponScopeProductCategoryList;
	
	@ApiModelProperty("优惠券列表")
	private List<Coupon> couponList;
	
	@ApiModelProperty("订单优惠金额绝对值")
	private BigDecimal orderDiscountAbs;
	
	@ApiModelProperty("订单优惠金额")
	private BigDecimal couponDiscountFee;
	
	public BigDecimal getAllowSkuFee() {
		return allowSkuFee;
	}

	public void setAllowSkuFee(BigDecimal allowSkuFee) {
		this.allowSkuFee = allowSkuFee;
	}

	public BigDecimal getOrderDiscountAbs() {
		return orderDiscountAbs;
	}

	public BigDecimal getCouponDiscountFee() {
		return couponDiscountFee;
	}

	public void setCouponDiscountFee(BigDecimal couponDiscountFee) {
		this.couponDiscountFee = couponDiscountFee;
	}

	public void setOrderDiscountAbs(BigDecimal orderDiscountAbs) {
		this.orderDiscountAbs = orderDiscountAbs;
	}

	public List<Coupon> getCouponList() {
		return couponList;
	}

	public void setCouponList(List<Coupon> couponList) {
		this.couponList = couponList;
	}

	public List<String> getScopeSpuIdList() {
		return scopeSpuIdList;
	}

	public void setScopeSpuIdList(List<String> scopeSpuIdList) {
		this.scopeSpuIdList = scopeSpuIdList;
	}

	public List<CouponScopeSpu> getCouponScopeSpuList() {
		return couponScopeSpuList;
	}

	public void setCouponScopeSpuList(List<CouponScopeSpu> couponScopeSpuList) {
		this.couponScopeSpuList = couponScopeSpuList;
	}

	public List<CouponScopeMerchant> getCouponScopeMerchantList() {
		return couponScopeMerchantList;
	}

	public void setCouponScopeMerchantList(List<CouponScopeMerchant> couponScopeMerchantList) {
		this.couponScopeMerchantList = couponScopeMerchantList;
	}

	public List<CouponScopeProductCategory> getCouponScopeProductCategoryList() {
		return couponScopeProductCategoryList;
	}

	public void setCouponScopeProductCategoryList(List<CouponScopeProductCategory> couponScopeProductCategoryList) {
		this.couponScopeProductCategoryList = couponScopeProductCategoryList;
	}

	public Integer getStatus() {
		return status;
	}

	public void setStatus(Integer status) {
		this.status = status;
	}

	public List<CouponTemplateRandom> getRandomList() {
		return randomList;
	}

	public void setRandomList(List<CouponTemplateRandom> randomList) {
		this.randomList = randomList;
	}
	

	public List<String> scopeSpuIdList() {
		return scopeSpuList.stream().map(Spu::getId).collect(Collectors.toList());
	}

	public List<Spu> getScopeSpuList() {
		return scopeSpuList;
	}

	public void setScopeSpuList(List<Spu> scopeSpuList) {
		this.scopeSpuList = scopeSpuList;
	}

	public Boolean getIsTickets() {
		return isTickets;
	}

	public void setIsTickets(Boolean isTickets) {
		this.isTickets = isTickets;
	}

	public List<CouponScopePark> getCouponScopeParkList() {
		return couponScopeParkList;
	}

	public void setCouponScopeParkList(List<CouponScopePark> couponScopeParkList) {
		this.couponScopeParkList = couponScopeParkList;
	}

	public boolean hasLowerLimit() {
		return this.lowerLimit.signum() != -1;
	}

	public boolean hasUpperLimit() {
		return this.upperLimit.signum() != -1;
	}

	/**
	 * 计算折扣金
	 * 
	 * @param totalAmount
	 *            订单总金额
	 * @param remainAmount
	 *            剩余可优惠金额
	 * @return 折扣金额（通过折扣优惠的金额）
	 */
	public BigDecimal calculateDiscountAmount(BigDecimal totalAmount, BigDecimal remainAmount) {
		BigDecimal discountAmount = BigDecimal.ZERO;
		if (hasLowerLimit() && totalAmount.subtract(lowerLimit).signum() == -1) {
			// 没有达到优惠下限，不进行优惠
			return discountAmount;
		}
		if (CouponTemplateFormat.DISCOUNT.equals(format)) {
			discountAmount = remainAmount.multiply(BigDecimal.ONE.subtract(discountRate));
		} else if (CouponTemplateFormat.DEDUCATION.equals(format)) {
			if (remainAmount.subtract(reductionMount).signum() == -1) {
				discountAmount = remainAmount;
			} else {
				discountAmount = reductionMount;
			}
		}
		if (hasUpperLimit() && upperLimit.subtract(discountAmount).signum() == -1) {
			// 优惠额度超出了上限，最多优惠额度为upperLimit
			discountAmount = upperLimit;
		}
		return discountAmount;
	}

	/**
	 * 构造一个空优惠券模板模型对象
	 */
	public CouponTemplate() {
		super();
	}

	/**
	 * 依据实体对象的信息构造一个优惠券模板模型对象
	 * 
	 * @param entity
	 *            实体对象
	 */
	public CouponTemplate(CouponTemplateEntity entity) {
		super(entity);
	}

	/**
	 * 依据其它对象的信息构造一个优惠券模板模型对象
	 * 
	 * @param other
	 *            其它对象
	 */
	public CouponTemplate(CouponTemplate other) {
		super(other);
	}

	@Override
	public String getId() {
		return id;
	}

	/**
	 * 设置优惠券模板ID
	 * 
	 * @param id
	 *            优惠券模板ID
	 * @return 当前对象
	 */
	public CouponTemplate id(String id) {
		this.id = id;
		return this;
	}

	@Override
	public CouponTemplateOwnerType getOwnerType() {
		return ownerType;
	}

	/**
	 * 设置[枚举]所有者类型(所有者承担成本)：0-平台-PLATFORM、1-集团-GROUP、2-商圈-BUSINESS_DISTRICT、3-商户-MERCHANT
	 * 
	 * @param ownerType
	 *            [枚举]所有者类型(所有者承担成本)：0-平台-PLATFORM、1-集团-GROUP、2-商圈-BUSINESS_DISTRICT、3-商户-MERCHANT
	 * @return 当前对象
	 */
	public CouponTemplate ownerType(CouponTemplateOwnerType ownerType) {
		this.ownerType = ownerType;
		return this;
	}

	@Override
	public String getGroupId() {
		return groupId;
	}

	/**
	 * 设置集团ID
	 * 
	 * @param groupId
	 *            集团ID
	 * @return 当前对象
	 */
	public CouponTemplate groupId(String groupId) {
		this.groupId = groupId;
		return this;
	}

	@Override
	public String getBusdId() {
		return busdId;
	}

	/**
	 * 设置商圈ID
	 * 
	 * @param busdId
	 *            商圈ID
	 * @return 当前对象
	 */
	public CouponTemplate busdId(String busdId) {
		this.busdId = busdId;
		return this;
	}

	@Override
	public String getMerchantId() {
		return merchantId;
	}

	/**
	 * 设置商户ID
	 * 
	 * @param merchantId
	 *            商户ID
	 * @return 当前对象
	 */
	public CouponTemplate merchantId(String merchantId) {
		this.merchantId = merchantId;
		return this;
	}

	@Override
	public String getTitle() {
		return title;
	}

	/**
	 * 设置优惠券标题
	 * 
	 * @param title
	 *            优惠券标题
	 * @return 当前对象
	 */
	public CouponTemplate title(String title) {
		this.title = title;
		return this;
	}

	@Override
	public String getImgUrl() {
		return imgUrl;
	}

	/**
	 * 设置优惠券图片地址
	 * 
	 * @param imgUrl
	 *            优惠券图片地址
	 * @return 当前对象
	 */
	public CouponTemplate imgUrl(String imgUrl) {
		this.imgUrl = imgUrl;
		return this;
	}

	@Override
	public String getThumUrl() {
		return thumUrl;
	}

	/**
	 * 设置优惠券图表地址
	 * 
	 * @param thumUrl
	 *            优惠券图表地址
	 * @return 当前对象
	 */
	public CouponTemplate thumUrl(String thumUrl) {
		this.thumUrl = thumUrl;
		return this;
	}

	@Override
	public CouponTemplateTimeLimitType getTimeLimitType() {
		return timeLimitType;
	}

	/**
	 * 设置[枚举]时间限制类型：0-固定时段-FIXED_RANGE、1-有效天数-VALID_DAYS
	 * 
	 * @param timeLimitType
	 *            [枚举]时间限制类型：0-固定时段-FIXED_RANGE、1-有效天数-VALID_DAYS
	 * @return 当前对象
	 */
	public CouponTemplate timeLimitType(CouponTemplateTimeLimitType timeLimitType) {
		this.timeLimitType = timeLimitType;
		return this;
	}

	@Override
	public LocalDateTime getStartTime() {
		return startTime;
	}

	/**
	 * 设置生效时间
	 * 
	 * @param startTime
	 *            生效时间
	 * @return 当前对象
	 */
	public CouponTemplate startTime(LocalDateTime startTime) {
		this.startTime = startTime;
		return this;
	}

	@Override
	public LocalDateTime getEndTime() {
		return endTime;
	}

	/**
	 * 设置过期时间
	 * 
	 * @param endTime
	 *            过期时间
	 * @return 当前对象
	 */
	public CouponTemplate endTime(LocalDateTime endTime) {
		this.endTime = endTime;
		return this;
	}

	@Override
	public Integer getValidDays() {
		return validDays;
	}

	/**
	 * 设置失效天数（领取后能够有效的天数）
	 * 
	 * @param validDays
	 *            失效天数（领取后能够有效的天数）
	 * @return 当前对象
	 */
	public CouponTemplate validDays(Integer validDays) {
		this.validDays = validDays;
		return this;
	}

	@Override
	public CouponTemplateScope getScope() {
		return scope;
	}

	/**
	 * 设置[枚举]使用范围：0-全体商品-ALL、1-指定商圈-BUSINESS_DISTRICT、2-指定商户-MERCHANT、3-指定产品-SPU、4-指定商品类目-PRODUCT_CATEGORY
	 * 
	 * @param scope
	 *            [枚举]使用范围：0-全体商品-ALL、1-指定商圈-BUSINESS_DISTRICT、2-指定商户-MERCHANT、3-指定产品-SPU、4-指定商品类目-PRODUCT_CATEGORY
	 * @return 当前对象
	 */
	public CouponTemplate scope(CouponTemplateScope scope) {
		this.scope = scope;
		return this;
	}

	@Override
	public Integer getScene() {
		return scene;
	}

	/**
	 * 设置支持的使用场景（把数字看为二进制序列，从右往左数，第0位表示：悦币充值、第1位表示：购买悦卡、第2位表示：会员向商户支付、第3位表示：购买优惠券、第4位表示：购买券包、第5位表示：组局订单、第6位表示：购买实物商品、第7位表示：停车支付）
	 * 
	 * @param scene
	 *            支持的使用场景（把数字看为二进制序列，从右往左数，第0位表示：悦币充值、第1位表示：购买悦卡、第2位表示：会员向商户支付、第3位表示：购买优惠券、第4位表示：购买券包、第5位表示：组局订单、第6位表示：购买实物商品、第7位表示：停车支付）
	 * @return 当前对象
	 */
	public CouponTemplate scene(Integer scene) {
		this.scene = scene;
		return this;
	}

	@Override
	public Integer getCurrency() {
		return currency;
	}

	/**
	 * 设置支持的币种（把数字看为二进制序列，从右往左数，第0位表示：悦币、第1位表示：发放的悦卡、第2位表示：购买的悦卡、第3位表示：积分、第4位表示：第三方钱包）
	 * 
	 * @param currency
	 *            支持的币种（把数字看为二进制序列，从右往左数，第0位表示：悦币、第1位表示：发放的悦卡、第2位表示：购买的悦卡、第3位表示：积分、第4位表示：第三方钱包）
	 * @return 当前对象
	 */
	public CouponTemplate currency(Integer currency) {
		this.currency = currency;
		return this;
	}

	@Override
	public Integer getChannel() {
		return channel;
	}

	/**
	 * 设置支持的获取优惠券通道（把数字看为二进制序列，从右往左数，第0位表示：购买、第1位表示：积分兑换、第2位表示：小票兑换）
	 * 
	 * @param channel
	 *            支持的获取优惠券通道（把数字看为二进制序列，从右往左数，第0位表示：购买、第1位表示：积分兑换、第2位表示：小票兑换）
	 * @return 当前对象
	 */
	public CouponTemplate channel(Integer channel) {
		this.channel = channel;
		return this;
	}

	@Override
	public CouponTemplateType getType() {
		return type;
	}

	/**
	 * 设置[枚举]优惠券类型：0-停车券-PARK
	 * 
	 * @param type
	 *            [枚举]优惠券类型：0-停车券-PARK
	 * @return 当前对象
	 */
	public CouponTemplate type(CouponTemplateType type) {
		this.type = type;
		return this;
	}

	@Override
	public CouponTemplateFormat getFormat() {
		return format;
	}

	/**
	 * 设置[枚举]优惠形式：0-抵扣券-DEDUCATION、1-折扣券-DISCOUNT
	 * 
	 * @param format
	 *            [枚举]优惠形式：0-抵扣券-DEDUCATION、1-折扣券-DISCOUNT
	 * @return 当前对象
	 */
	public CouponTemplate format(CouponTemplateFormat format) {
		this.format = format;
		return this;
	}

	@Override
	public BigDecimal getReductionMount() {
		return reductionMount;
	}

	/**
	 * 设置[抵扣券]抵扣金额（0.00表示无抵扣）
	 * 
	 * @param reductionMount
	 *            [抵扣券]抵扣金额（0.00表示无抵扣）
	 * @return 当前对象
	 */
	public CouponTemplate reductionMount(BigDecimal reductionMount) {
		this.reductionMount = reductionMount;
		return this;
	}

	@Override
	public BigDecimal getDiscountRate() {
		return discountRate;
	}

	/**
	 * 设置[折扣券]折扣率（0.00~1.00，例如九五折：0.95，1.00表示无折扣）
	 * 
	 * @param discountRate
	 *            [折扣券]折扣率（0.00~1.00，例如九五折：0.95，1.00表示无折扣）
	 * @return 当前对象
	 */
	public CouponTemplate discountRate(BigDecimal discountRate) {
		this.discountRate = discountRate;
		return this;
	}

	@Override
	public BigDecimal getLowerLimit() {
		return lowerLimit;
	}

	/**
	 * 设置使用门槛下限（包含，即订单满多少才能使用，-1.00表示不限制）
	 * 
	 * @param lowerLimit
	 *            使用门槛下限（包含，即订单满多少才能使用，-1.00表示不限制）
	 * @return 当前对象
	 */
	public CouponTemplate lowerLimit(BigDecimal lowerLimit) {
		this.lowerLimit = lowerLimit;
		return this;
	}

	@Override
	public BigDecimal getUpperLimit() {
		return upperLimit;
	}

	/**
	 * 设置使用门槛上限（包含，-1.00表示不限制）
	 * 
	 * @param upperLimit
	 *            使用门槛上限（包含，-1.00表示不限制）
	 * @return 当前对象
	 */
	public CouponTemplate upperLimit(BigDecimal upperLimit) {
		this.upperLimit = upperLimit;
		return this;
	}

	@Override
	public Integer getPersonalLimit() {
		return personalLimit;
	}

	/**
	 * 设置每人限领张数（-1表示不限制）
	 * 
	 * @param personalLimit
	 *            每人限领张数（-1表示不限制）
	 * @return 当前对象
	 */
	public CouponTemplate personalLimit(Integer personalLimit) {
		this.personalLimit = personalLimit;
		return this;
	}

	@Override
	public Integer getMemberLevelLimit() {
		return memberLevelLimit;
	}

	/**
	 * 设置会员等级限制（-1表示不限制，1表示等级大于等于1级的会员可以用，以此类推）
	 * 
	 * @param memberLevelLimit
	 *            会员等级限制（-1表示不限制，1表示等级大于等于1级的会员可以用，以此类推）
	 * @return 当前对象
	 */
	public CouponTemplate memberLevelLimit(Integer memberLevelLimit) {
		this.memberLevelLimit = memberLevelLimit;
		return this;
	}

	@Override
	public Boolean getAllowSale() {
		return allowSale;
	}

	/**
	 * 设置是否允许售卖（1：允许售卖、2：不允许售卖）
	 * 
	 * @param allowSale
	 *            是否允许售卖（1：允许售卖、2：不允许售卖）
	 * @return 当前对象
	 */
	public CouponTemplate allowSale(Boolean allowSale) {
		this.allowSale = allowSale;
		return this;
	}

	@Override
	public String getDiscription() {
		return discription;
	}

	/**
	 * 设置优惠券描述
	 * 
	 * @param discription
	 *            优惠券描述
	 * @return 当前对象
	 */
	public CouponTemplate discription(String discription) {
		this.discription = discription;
		return this;
	}

	@Override
	public Integer getSort() {
		return sort;
	}

	/**
	 * 设置排序号
	 * 
	 * @param sort
	 *            排序号
	 * @return 当前对象
	 */
	public CouponTemplate sort(Integer sort) {
		this.sort = sort;
		return this;
	}

	@Override
	public CouponTemplateShelfStatus getShelfStatus() {
		return shelfStatus;
	}

	/**
	 * 设置[枚举]上架状态：0-已下架-OFF_SHELF、1-已上架-ON_SHELF
	 * 
	 * @param shelfStatus
	 *            [枚举]上架状态：0-已下架-OFF_SHELF、1-已上架-ON_SHELF
	 * @return 当前对象
	 */
	public CouponTemplate shelfStatus(CouponTemplateShelfStatus shelfStatus) {
		this.shelfStatus = shelfStatus;
		return this;
	}

	@Override
	public String getCreatedBy() {
		return createdBy;
	}

	/**
	 * 设置创建者
	 * 
	 * @param createdBy
	 *            创建者
	 * @return 当前对象
	 */
	public CouponTemplate createdBy(String createdBy) {
		this.createdBy = createdBy;
		return this;
	}

	@Override
	public LocalDateTime getCreatedTime() {
		return createdTime;
	}

	/**
	 * 设置创建时间
	 * 
	 * @param createdTime
	 *            创建时间
	 * @return 当前对象
	 */
	public CouponTemplate createdTime(LocalDateTime createdTime) {
		this.createdTime = createdTime;
		return this;
	}

	@Override
	public String getModifiedBy() {
		return modifiedBy;
	}

	/**
	 * 设置修改人
	 * 
	 * @param modifiedBy
	 *            修改人
	 * @return 当前对象
	 */
	public CouponTemplate modifiedBy(String modifiedBy) {
		this.modifiedBy = modifiedBy;
		return this;
	}

	@Override
	public LocalDateTime getModifiedTime() {
		return modifiedTime;
	}

	/**
	 * 设置修改时间
	 * 
	 * @param modifiedTime
	 *            修改时间
	 * @return 当前对象
	 */
	public CouponTemplate modifiedTime(LocalDateTime modifiedTime) {
		this.modifiedTime = modifiedTime;
		return this;
	}

	@Override
	public Boolean getDel() {
		return del;
	}

	/**
	 * 设置是否删除（1：已删除，0：未删除）
	 * 
	 * @param del
	 *            是否删除（1：已删除，0：未删除）
	 * @return 当前对象
	 */
	public CouponTemplate del(Boolean del) {
		this.del = del;
		return this;
	}

	@Override
	public String getDelBy() {
		return delBy;
	}

	/**
	 * 设置删除人
	 * 
	 * @param delBy
	 *            删除人
	 * @return 当前对象
	 */
	public CouponTemplate delBy(String delBy) {
		this.delBy = delBy;
		return this;
	}

	@Override
	public LocalDateTime getDelTime() {
		return delTime;
	}

	/**
	 * 设置删除时间
	 * 
	 * @param delTime
	 *            删除时间
	 * @return 当前对象
	 */
	public CouponTemplate delTime(LocalDateTime delTime) {
		this.delTime = delTime;
		return this;
	}

	@Override
	public CouponTemplateCheckedStatus getCheckedStatus() {
		return checkedStatus;
	}

	/**
	 * 设置[枚举]审核状态：0-待提交-NOT_SUBMITTED、1-审核中-CHECKING、2-已通过-PASSED、3-审核未通过-UNPASSED
	 * 
	 * @param checkedStatus
	 *            [枚举]审核状态：0-待提交-NOT_SUBMITTED、1-审核中-CHECKING、2-已通过-PASSED、3-审核未通过-UNPASSED
	 * @return 当前对象
	 */
	public CouponTemplate checkedStatus(CouponTemplateCheckedStatus checkedStatus) {
		this.checkedStatus = checkedStatus;
		return this;
	}

	@Override
	public String getCheckedBy() {
		return checkedBy;
	}

	/**
	 * 设置审核人
	 * 
	 * @param checkedBy
	 *            审核人
	 * @return 当前对象
	 */
	public CouponTemplate checkedBy(String checkedBy) {
		this.checkedBy = checkedBy;
		return this;
	}

	@Override
	public LocalDateTime getCheckedTime() {
		return checkedTime;
	}

	/**
	 * 设置审核时间
	 * 
	 * @param checkedTime
	 *            审核时间
	 * @return 当前对象
	 */
	public CouponTemplate checkedTime(LocalDateTime checkedTime) {
		this.checkedTime = checkedTime;
		return this;
	}

	@Override
	public String getCheckedRemark() {
		return checkedRemark;
	}

	/**
	 * 设置审核意见
	 * 
	 * @param checkedRemark
	 *            审核意见
	 * @return 当前对象
	 */
	public CouponTemplate checkedRemark(String checkedRemark) {
		this.checkedRemark = checkedRemark;
		return this;
	}
	
	public List<Sku> getAllowSkuList() {
		return allowSkuList;
	}

	public void setAllowSkuList(List<Sku> allowSkuList) {
		this.allowSkuList = allowSkuList;
	}

	public void buildDiscountItem(List<Sku> allowSkuList) {
		this.allowSkuList = allowSkuList;
		this.allowSkuFee =  allowSkuList.stream().map(sku-> sku.getDiscountPrice().multiply(new BigDecimal(sku.getBuyNum()))).reduce(BigDecimal.ZERO, BigDecimal::add);
	}

	/**生成券模板的有效过期时间*/
	public LocalDateTime genExpireEndTime() {
		if(timeLimitType== CouponTemplateTimeLimitType.FIXED_RANGE){
			return endTime;
		}else{
			if (validDays != null) {
				return LocalDateTime.now().plusDays(validDays);
			}
			if (validHours != null) {
				return LocalDateTime.now().plusHours(validHours);
			}
		}
		return null;
	}
}
